iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 18

Day18. 安全性就像是洋蔥一層層組成

  • 分享至 

  • xImage
  •  

⛑️🔕🤺如果你願意,一層一層的設定安全性,你會發現,這篇介紹3個重要的安全性層面,Image Security、Security Context和Network Policies,負責不同的事物,在安全議題上,共同抵擋或是減輕危險行為造成的傷害

Image Security- 確保使用來源安全

確保容器使用的image是安全的,從可信任的地方(registry),拉取經過弱點掃描,經過驗證的image,複習一下建立container時,需要使用image,其名稱完整格式為:
image: <registry>/<repository>/<image>:<tag>

  • registry:若未指定,預設為Docker Hub,名稱為docker.io
  • repository:儲存image的地方,例如為個人帳戶或組織命名空間,若未指定,預設為library
  • image:欲拉取的映像檔,若未指定,預設拉取最新版本latest
    • docker範例: docker.io/library/nginx
    • gcp範例: gcr.io/kubernetes-e2e-test-images/dnsutils

設定由私有的(private)registry拉取時,需要些機密資訊

  1. 一般使用Private Repository的時候
  • 先登入該repo: docker login private-registry.io
  • 再拉取其image(全名): docker run private-registry.io/apps/internal-app
  1. 在K8s使用的時候,則是可以提供secret,在拉取image時使用,指定類型為docker-registry,名稱以regcred簡寫 (registry credential)
  • 建立secret
    kubectl create secret docker-registry regcred \
        --docker-server=<your-registry-server> \
        --docker-username=<your-username> \
        --docker-password=<your-password> \
        --docker-email=<your-email>
    
  • 提供image 全名於pod, 並放上secret
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
    spec:
      containers:
      - name: nginx
        image: private-registry.io/apps/internal-app
        imagePullSecrets: # 拉取image時,使用此secret
        - name: regcred
    

Security context- 控管執行權限

定義權限控管Pod或者是container,針對程式執行可有的權限管控

  • pod level: 對其內的所有containers生效
  • container level: 會覆蓋pod level的設定

定義的項目像是:

  • Discretionary Access Control: 訪問目標(如檔案)的權限基於User ID(UID)和 Group ID(GID)
  • Security Enhanced Linux (SELinux): 為目標分配安全標籤
  • Running as privileged or unprivileged: 以特權或非特權運行
  • Linux Capabilities: 為某些process提供特權,但不是root的所有特權(非等同於host root權限)
  • AppArmor: 使用程式配置文件來限制個別程式的功能。
  • Seccomp (secure computing): 過濾及篩選process的system call
  • AllowPrivilegeEscalation: 控制process是否可以比其parent process獲得更多的特權
  • readOnlyRootFilesystem: 將容器的root file system mount 為 Read-Only。

建立security context

apiVersion: v1
kind: Pod
metadata:
  name: web-pod
spec:
  # pod level
  securityContext:
    runAsUser: 1000 # 以1000這個user執行
  containers:
    - name: ubuntu
      image: ubuntu
      command: ["sleep", "3600"]
      # container level
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000 # 指定掛載volume檔案目錄的群組所有權
        # 只能在container level使用
        capabilities:
          add: ["MAC_ADMIN"]

Network policies- 進出交通管制

K8s內的pod,在任何的網路配置下,都應該要是無額外配置就能互連,也就是預設叢集內pod跟service都是互相連通,這些進出的流量,設定由network policies管制 (非所有Solution皆支援,有支援的像是Kube router, Calico, Romana, Weave net等)

traffic的類型

  • Ingress: 來自外部的請求 (incoming request)
  • Egress: 向外發出請求 (outgoing request)
  1. 首先,Pod定義有各式label,作為選取標的
  2. 建立網路政策(NetworkPolicy),使用label綁定
  • 定義可互通的Pod
  • 限制特定Pod或Service存取
  • 限定特定的ip網段可流通
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
spec:
  # 1. 抓取pod
  podSelector:
    matchLabels:
      role: db
  # 2. 指定類別
  policyTypes:
  - Ingress
  - Egress
  # 3. 分別設定規則
  ingress:
  - from:
    - podSelector:
        matchLabels:
          name: api-pod
      namespaceSelector:
        matchLabels:
          name: prod
    - ipBlock: # 可接受的來源端
        cidr: 192.168.1.02/32
  egress:
  - to:
    - ipBlock:
        cidr: 192.168.3.10/32    
    ports:
    - protocol: TCP
      port: 3306

networkpolicy操作指令

# 取得資訊
kubectl get networkpolies
kubectl get netpol
kubectl describe netpol <name>
# 編輯netpol
kubectl edit networkpolicy <name>
# 刪除netpol
kubectl delete networkpolicy <name>

上一篇
Day17. 獲取頭銜(binding),打開世界的大門
下一篇
Day19. 叢集內的網路
系列文
今天不學遺傳學,跟著Kubernetes種豌豆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言